<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="https://www.w3.org/1999/xhtml" lang="zh-CN" xml:lang="zh-CN">
<head><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
    <title>5.7. 调整工具链</title>
    <link rel="stylesheet" href="../stylesheets/lfs.css" type="text/css" />
    <link rel="stylesheet" href="../stylesheets/lfs-print.css" type="text/css" media="print" />
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head>
  <body id="lfs" class="6.2">
    <div class="navheader">
      <div class="headertitles">
        <h4>Linux From Scratch - 版本 6.2</h4>
        <h3>第五章 构建临时编译环境</h3>
      </div>
      <ul class="headerlinks">
        <li class="prev">
          <a accesskey="p" href="glibc.html" title="Glibc-2.3.6">后退</a>
          <p>Glibc-2.3.6</p>
        </li>
        <li class="next">
          <a accesskey="n" href="tcl.html" title="Tcl-8.4.13">前进</a>
          <p>Tcl-8.4.13</p>
        </li>
        <li class="up"><a accesskey="u" href="chapter05.html" title="第五章 构建临时编译环境">上一级</a></li>
        <li class="home"><a accesskey="h" href="../index.html" title="Linux From Scratch - 版本 6.2">首页</a></li>
      </ul>
    </div>
    <div class="sect1">
      <div class="titlepage">
        <h1 class="sect1">5.7. 调整工具链</h1>
      </div>
      <p>现在临时的C库已经装好，接下来本章中要编译的所有工具应该连接到这些库上。为了达到这个目标，需要调整连接器和编译器的 specs 文件。</p>
      <p>在第一遍编译 Binutils 快结束时已经调整过的连接器，现在需要被重新命名以便可以被正确的找到和使用。首先备份原来的连接器，然后用调整过的连接器来替代，最后还要创建一个指向 <tt class="filename">/tools/$(gcc -dumpmachine)/bin</tt> 中连接器副本的连接。</p>
      <pre class="userinput"><kbd class="command">mv -v /tools/bin/{ld,ld-old}
mv -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old}
mv -v /tools/bin/{ld-new,ld}
ln -sv /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld</kbd></pre>
      <p>从现在开始，所有程序都将连接到 <tt class="filename">/tools/lib</tt> 中的库文件。</p>
      <p>下面要做的是修正 GCC 的"<span class="quote">specs</span>"文件，使它指向新的动态连接器。一个简单的 <span><strong class="command">sed</strong></span> 命令就能做到：</p>
      <pre class="userinput"><kbd class="command">SPECFILE=`dirname $(gcc -print-libgcc-file-name)`/specs &amp;&amp;
gcc -dumpspecs &gt; $SPECFILE &amp;&amp;
sed 's@^/lib/ld-linux.so.2@/tools&amp;@g' $SPECFILE &gt; tempspecfile &amp;&amp;
mv -vf tempspecfile $SPECFILE &amp;&amp;
unset SPECFILE</kbd></pre>
      <p>推荐你拷贝和粘贴上面的命令，而不是手动输入。当然你也可以手动编辑 specs 文件，只要把所有的"/lib/ld-linux.so.2"都替换成"/tools/lib/ld-linux.so.2"就行了。</p>
      <p>请用你的眼睛亲自仔细检查一下 specs 文件，以确保上述修改的的确确生效了。</p>
      <div class="important">
        <div class="admonhead">
          <img alt="[Important]" src="../images/important.png" />
          <h3 class="admontitle">重要</h3>
        </div>
        <div class="admonbody">
          <p>如果你的系统平台上，动态连接器的名字不是 <tt class="filename">ld-linux.so.2</tt> ，你必须把上面命令里的"ld-linux.so.2"换成你的系统平台上动态连接器的名字。参见<a href="toolchaintechnotes.html" title="5.2. 工具链技术说明">节 5.2, "工具链技术说明,"</a>。</p>
        </div>
      </div>
      <p>在编译过程中，GCC 会运行 <span><strong class="command">fixincludes</strong></span> 脚本来扫描系统头文件目录，并找出需要修正的头文件(比如包含语法错误)，然后把修正后的文件放到 GCC 专属头文件目录里。因此，它可能会找出宿主系统中需要修正的头文件，并将修正后的结果放到 GCC 专属头文件目录里。由于本章的剩余部分仅需要使用当前已经安装好的 GCC 和 Glibc 的头文件，所以任何"<span class="quote">修正后的</span>"头文件都可以被安全的删除。并且这样做也有助于避免宿主系统中的头文件"污染"编译环境。运行下面的命令删除 GCC 专属头文件目录中的头文件(由于命令较长，推荐你拷贝和粘贴命令，而不是手动输入)：</p>
      <pre class="userinput"><kbd class="command">GCC_INCLUDEDIR=`dirname $(gcc -print-libgcc-file-name)`/include &amp;&amp;
find ${GCC_INCLUDEDIR}/* -maxdepth 0 -xtype d -exec rm -rvf '{}' \; &amp;&amp;
rm -vf `grep -l "DO NOT EDIT THIS FILE" ${GCC_INCLUDEDIR}/*` &amp;&amp;
unset GCC_INCLUDEDIR</kbd></pre>
      <div class="caution">
        <div class="admonhead">
          <img alt="[Caution]" src="../images/caution.png" />
          <h3 class="admontitle">小心</h3>
        </div>
        <div class="admonbody">
          <p>现在，需要停下来确认新工具链的基本功能(编译和连接)是否按预期工作，运行下面的命令做一个简单的合理性检查：</p>
          <pre class="userinput"><kbd class="command">echo 'main(){}' &gt; dummy.c
cc dummy.c
readelf -l a.out | grep ': /tools'</kbd></pre>
          <p>如果一切正常，应该不会出错，而且最后一个命令的结果应当是：</p>
          <pre class="screen"><tt class="computeroutput">[Requesting program interpreter: /tools/lib/ld-linux.so.2]</tt></pre>
          <p>注意，<tt class="filename">/tools/lib</tt> 应该是动态连接器的前缀。</p>
          <p>如果输出不是像上面那样或者根本没有输出，那么就有大问题了。返回并检查前面的操作，找出问题，并改正过来。在改正之前，不要继续后面的部份，因为这样做没有意义。首先，再次上述合理性检查，用 <span><strong class="command">gcc</strong></span> 代替 <span><strong class="command">cc</strong></span> ，如果工作正常，那么是因为 <tt class="filename">/tools/bin/cc</tt> 这个符号链接丢失了。回头看看<a href="gcc-pass1.html" title="5.4. GCC-4.0.3 - 第一遍">节 5.4, "GCC-4.0.3 - 第一遍,"</a>，并建立符号链接。接下来，确保 <tt class="envar">PATH</tt> 正确。检查时，运行 <span><strong class="command">echo $PATH</strong></span> 并检查 <tt class="filename">/tools/bin</tt> 是否在列表的最前面。如果 <tt class="envar">PATH</tt> 错误，可能是因为你没有以 <tt class="systemitem">lfs</tt> 用户登录，或者在<a href="../chapter04/settingenvironment.html" title="4.4. 设置工作环境">节 4.4, "设置工作环境."</a>部分出错了。另外一个原因可能是上面修正 specs 文件时出错，如果这样，重新修改 specs 文件，复制粘贴时要小心仔细。</p>
          <p>在确定一切正常后，删除测试文件：</p>
          <pre class="userinput"><kbd class="command">rm -v dummy.c a.out</kbd></pre>
        </div>
      </div>
      <div class="note">
        <div class="admonhead">
          <img alt="[Note]" src="../images/note.png" />
          <h3 class="admontitle">注意</h3>
        </div>
        <div class="admonbody">
          <p>下一小节中编译 TCL 时也将有助于检查工具连是否正确。如果 TCL 编译失败则表示之前安装的 Binutils 、GCC 或 Glibc 有问题，而不是 TCL 自身有问题。</p>
        </div>
      </div>
    </div>
    <div class="navfooter">
      <ul>
        <li class="prev">
          <a accesskey="p" href="glibc.html" title="Glibc-2.3.6">后退</a>
          <p>Glibc-2.3.6</p>
        </li>
        <li class="next">
          <a accesskey="n" href="tcl.html" title="Tcl-8.4.13">前进</a>
          <p>Tcl-8.4.13</p>
        </li>
        <li class="up"><a accesskey="u" href="chapter05.html" title="第五章 构建临时编译环境">上一级</a></li>
        <li class="home"><a accesskey="h" href="../index.html" title="Linux From Scratch - 版本 6.2">首页</a>.
        </li>
      </ul>
    </div>
</body></html>
